//请根据每日 气温 列表，重新生成一个列表。对应位置的输出为：要想观测到更高的气温，至少需要等待的天数。如果气温在这之后都不会升高，请在该位置用 0 来代替。
// 
//
// 例如，给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]，你的输出应该是 [1, 1, 4, 2
//, 1, 1, 0, 0]。 
//
// 提示：气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度，都是在 [30, 100] 范围内的整数。 
// Related Topics 栈 哈希表 
// 👍 458 👎 0

package leetcode.editor.cn;

import common.util.MyUtil;

import java.util.Arrays;

/**
 * Java：每日温度
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P739_DailyTemperatures {
    public static void main(String[] args) {
        Solution solution = new P739_DailyTemperatures().new Solution();
        // TODO 此处开始你的表演
        int[] arr = MyUtil.createArray(73, 74, 75, 71, 69, 72, 76, 73);
        //int[] arr = MyUtil.createFixedArray(73);
        MyUtil.print(Arrays.toString(solution.dailyTemperatures(arr)));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    ///**
    // * 单调栈，递增
    // * 时间复杂度 O(n)
    // * 空间复杂度 O(n)
    // */
    //class Solution {
    //    public int[] dailyTemperatures(int[] T) {
    //        // 结果集
    //        int[] res = new int[T.length];
    //        // 哨兵数组
    //        int[] newT = new int[T.length + 2];
    //        System.arraycopy(T, 0, newT, 1, T.length);
    //        // 最大值为100, 哨兵设置为101即可, 保证所有元素能出栈
    //        newT[0] = newT[newT.length - 1] = 101;
    //        Deque<Integer> deque = new ArrayDeque<>();
    //        deque.push(0);
    //        for (int i = 1; i < newT.length; i++) {
    //            while(newT[i] > newT[deque.peek()]) {
    //                // 出栈
    //                Integer index = deque.poll();
    //                res[index-1] = i == newT.length -1 ? 0 : (i - index);
    //            }
    //            deque.push(i);
    //        }
    //        return res;
    //    }
    //}

    /**
     * TODO
     */
    class Solution {
        public int[] dailyTemperatures(int[] T) {
            int length = T.length;
            int[] result = new int[length];
            //从右向左遍历
            for (int i = length - 2; i >= 0; i--) {
                // j+= result[j]是利用已经有的结果进行跳跃
                for (int j = i + 1; j < length; j += result[j]) {
                    if (T[j] > T[i]) {
                        result[i] = j - i;
                        break;
                    } else if (result[j] == 0) { //遇到0表示后面不会有更大的值，那当然当前值就应该也为0
                        result[i] = 0;
                        break;
                    }
                }
            }
            return result;
        }
    }


    //leetcode submit region end(Prohibit modification and deletion)

}
